// 对axios进行二次封装：使用请求与响应拦截器
import axios from "axios";
import { ElMessage } from "element-plus";
import { useUserStore } from "@/store/modules/user";
import { useRouter, useRoute } from "vue-router";

// 创建axios实例
const request = axios.create({
    // 基础路径
    baseURL: import.meta.env.VITE_APP_BASE_API,
    // 超时时间
    timeout: 5000
});

request.interceptors.request.use((config) => {
    const userStore = useUserStore();
    // token存在的话，携带token
    if (userStore.token) {
        config.headers.Authorization = userStore.token;
    }

    // 一定要返回配置对象，不然请求发送不成功
    return config;
});

request.interceptors.response.use((response) => {
    // 成功回调

    return response.data;
}, (err) => {
    // 失败回调
    // 路由器对象
    const $router = useRouter();
    // 路由对象
    const $route = useRoute();
    // 定义一个变量：存在网络错误信息
    let message = '';
    // 状态码
    let status = err.response?.status;
    
    // 状态码处理
    switch (status) {
        case 401:
            message = 'TOKEN过期，请重新登录';
            $router.push(`/login?redirect=${$route.path}`)
            break;
        case 403:
            message = '无权访问'
            break;
        case 404:
            message = '请求地址错误';
            break;
        case 500:
            message = '服务器出现问题';
            break;
        default:
            message = '请求超时';
            break;
    }
    ElMessage({
        type: 'error',
        message
    });
});

export default request;